home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / tools / sharp / sxwork2.lzh / サンプル基礎編 / ファイル操作 / FLDITEM.C < prev    next >
Text File  |  1994-03-10  |  8KB  |  232 lines

  1. /******************************************************************************
  2.  *    flditem.c:        ダイアログの処理関数
  3.  ******************************************************************************
  4.  *    Workroom SX-68K Sample Program Copyright 1994 SHARP
  5.  */
  6. #include <console.h>        /* コンソール系マネージャを利用するときに必要 */
  7. #include <sxgraph.h>        /* グラフ系マネージャを利用するときに必要 */
  8. #include <window.h>        /* ウィンドウマンを利用するときに必要    */
  9. #include <dialog.h>        /* ダイアログマンを利用するときに必要    */
  10. #include <text.h>        /* テキストマンを利用するときに必要    */
  11. #include <task.h>        /* タスクマンを利用するときに必要    */
  12. #include "file.h"        /* このプログラム固有のヘッダファイル    */
  13.  
  14. static int dlgMode;            /* ダイアログ処理モード        */
  15.  
  16. static short funcKeyTbl[] = {        /* ファンクションキーアサインテーブル */
  17.     K_HOME,  0,            /* [HOME]    */
  18.     K_DEL,   0x07,            /* [DEL]    */
  19.     K_RUP,   0x03,            /* [ROLL UP]    */
  20.     K_RDOWN, 0x12,            /* [ROLL DOWN]    */
  21.     K_UNDO,  0,            /* [UNDO]    */
  22.     K_LEFT,  0x13,            /* [←]        */
  23.     K_UP,    0x05,            /* [↑]        */
  24.     K_RIGHT, 0x04,            /* [→]        */
  25.     K_DOWN,  0x18,            /* [↓]        */
  26.     K_CLR,   0,            /* [CLR]    */
  27.     K_HELP,  0,            /* [HELP]    */
  28.     K_INS,   0,            /* [INS]    */
  29.     0, 0                /* テーブル終端    */
  30. };
  31.  
  32. /******************************************************************************
  33.  *    dialogProc():    ダイアログの作成、表示と各種処理
  34.  ******************************************************************************
  35.  *    引数:    ComVal *pcv    共通変数へのポインタ
  36.  *        DlgPrm *pdp    ダイアログ処理用パラメータへのポインタ
  37.  *    戻り値:    int num        終了したダイアログアイテムの番号
  38.  *                = 1: [実行]ボタン
  39.  *                = 2: [取消]ボタン
  40.  *                < 0: 処理失敗
  41.  */
  42. int dialogProc(ComVal *pcv, DlgPrm *pdp)
  43. {
  44.     int num;            /* ダイアログのアイテム番号    */
  45.     int lastBC;
  46.     Rect rc;
  47.     Handle dIListHdl;
  48.     Graph *lastGraph;
  49.     Dialog dialog;            /* ダイアログレコード        */
  50.     Dialog *dialogPtr = &dialog;    /* ダイアログポインタ(疑似ポインタ)*/
  51.  
  52.     static Rect dlgPos[2] = {    /* ダイアログの表示位置        */
  53.         /* 入力欄が1つ */
  54.         { DLG1_X, DLG1_Y, DLG1_X + DLG1_H, DLG1_Y + DLG1_V },
  55.         /* 入力欄が2つ */
  56.         { DLG2_X, DLG2_Y, DLG2_X + DLG2_H, DLG2_Y + DLG2_V }
  57.     };
  58.  
  59.     /* ダイアログアイテムのリソースを読み込む */
  60.     dIListHdl = TSRscGet('DITL', pdp->mode + 127);
  61.     if (dIListHdl == NULL) {
  62.         pcv->errorCode = 14;    /* 読み込めなかった        */
  63.         return -1;        /* 失敗したので-1を返す    */
  64.     }
  65.  
  66.     /* ダイアログの表示位置を補正する */
  67.     TSAdjustRect(&rc, &dlgPos[pdp->mode - 1], 16);
  68.     dialogPtr = DMOpen(        /* ダイアログをオープンする    */
  69.         dialogPtr,        /* 用意したダイアログポインタ    */
  70.         &rc,            /* ダイアログの表示位置        */
  71.         NONTITLE,        /* タイトルは自分で描画する    */
  72.         FALSE,            /* オープン時に描画しない    */
  73.         WI_DLG << 4,        /* ダイアログウィンドウ        */
  74.         W_FRONT,        /* 一番手前に表示する        */
  75.         FALSE,            /* クローズボタンを使用しない    */
  76.         LONGWORD(1, TSGetID()),    /* 自分のタスクID        */
  77.         dIListHdl);        /* アイテムリストへのハンドル    */
  78.     if (dialogPtr == NULL) {
  79.         pcv->errorCode = 7;    /* 作成できなかった        */
  80.         return -1;        /* 失敗したので-1を返す    */
  81.     }
  82.     /* ファンクションキーアサインテーブルを設定する */
  83.     (*dialogPtr->tEdit)->funcCode = funcKeyTbl;
  84.     /* 編集可能テキストの文字列をクリアする */
  85.     setDItemText(dialogPtr, 3, NONTITLE);
  86.     if (pdp->mode == 2)
  87.         setDItemText(dialogPtr, 4, NONTITLE);
  88.  
  89.     WMShow(&dialogPtr->window);    /* ダイアログを表示する        */
  90.     /* ダイアログをカレントグラフにする */
  91.     lastGraph = GMExgGraph(&dialogPtr->window.graph);
  92.  
  93.     /* タイトルを描画する */
  94.     GMShadowStrZ(pdp->title, LONGWORD((DLG1_H - pdp->len * 6) / 2, 4));
  95.     GMShadowStrZ(pdp->str1, LONGWORD(16, 28));
  96.     if (pdp->mode == 2)
  97.         GMShadowStrZ(pdp->str2, LONGWORD(16, 76));
  98.     lastBC = GMBackColor(G_WHITE);    /* バックグラウンドカラーを白にする */
  99.     DMDraw(dialogPtr);        /* すべてのアイテムを描画する    */
  100.  
  101.     dlgMode = pdp->mode;        /* ダイアログ処理モードを設定する */
  102.     while (1) {
  103.         /* 帰還属性を持つアイテムが押されるまで、アイテムの各種処理を
  104.            システムに任せて、押されたアイテムの番号を取得する */
  105.         num = DMControl(filterProc);
  106.         if (num == 1) {
  107.             /* [実行]ボタンの処理 */
  108.             /* 編集可能テキスト1の文字列を取得する */
  109.             getDItemText(dialogPtr, 3, pdp->src);
  110.             if (pdp->mode == 2)
  111.                 /* 編集可能テキスト2の文字列を取得する */
  112.                 getDItemText(dialogPtr, 4, pdp->dst);
  113.             break;
  114.         } else if (num == 2)
  115.             /* [取消]ボタンの処理 */
  116.             break;
  117.     }
  118.     GMBackColor(lastBC);        /* バックグラウンドカラーを元に戻す */
  119.     DMClose(dialogPtr);        /* ダイアログをクローズする    */
  120.     GMSetGraph(lastGraph);        /* カレントグラフを元に戻す    */
  121.  
  122.     /* 処理が完了したのでアイテム番号を返す */
  123.     return num;
  124. }
  125.  
  126. /******************************************************************************
  127.  *    filterProc():    ダイアログのフィルタ関数
  128.  ******************************************************************************
  129.  *    引数:    Dialog *dlgPtr    ダイアログポインタ
  130.  *        Event *pev    イベントレコードへのポインタ
  131.  *    戻り値:    int 終了コード(ここでは、常に0)
  132.  *    注釈:
  133.  *    DMControlから呼び出され、カーソルの点滅処理と、リターンキー/ESCキーの
  134.  *    入力を[設定]/[取消]ボタンのマウス左ダウンイベントに変換する処理を行う。
  135.  */
  136. int filterProc(Dialog *dlgPtr, Event *pev)
  137. {
  138.     int keyCode;            /* キーコード            */
  139.     int num = 0;            /* ダイアログのアイテム番号    */
  140.     short type;
  141.     Rect rc, rc1, rc2;
  142.     Handle item;
  143.  
  144.     /* ダイアログをカレントグラフにする */
  145.     GMSetGraph(&dlgPtr->window.graph);
  146.  
  147.     DIGet(dlgPtr, 3, &type, &item, &rc1);
  148.     if (dlgMode == 2)
  149.         DIGet(dlgPtr, 4, &type, &item, &rc2);
  150.     switch (pev->what) {        /* イベントの種類は?        */
  151.     case E_IDLE:            /* アイドルイベント        */
  152.         TMIdle(dlgPtr->tEdit);    /* カーソルを点滅させる        */
  153.         break;
  154.     case E_KEYDOWN:            /* キーダウンイベント        */
  155.         /* キーコードをファンクションキーアサインテーブルで変換する */
  156.         keyCode = TMKeyToAsk(dlgPtr->tEdit, (TsEvent *) pev);
  157.         /* キーコードがあるか? */
  158.         if (keyCode != -1 && keyCode != 0) {
  159.             switch (pev->whom.key.ascii) {
  160.             case '\r':    /* リターンキーかENTERキー    */
  161.                 if ((*dlgPtr->tEdit)->view.l.l_t == rc1.l.l_t)
  162.                     /* ダイアログ処理モードが2の場合、
  163.                        次の編集テキストへ移る */
  164.                     num = (dlgMode == 2) ? 4 : 1;
  165.                 else if (dlgMode == 2
  166.                     && (*dlgPtr->tEdit)->view.l.l_t == rc2.l.l_t)
  167.                     num = 1; /* [実行]ボタン    */
  168.                 break;
  169.             case '\x1b':    /* ESCキー            */
  170.                 num = 2; /* [取消]ボタン        */
  171.                 break;
  172.             }
  173.             if (num != 0) {
  174.                 /* 指定アイテムのレクタングル内を指す座標を
  175.                    作成する */
  176.                 DIGet(dlgPtr, num, &type, &item, &rc);
  177.                 /* 縦横4ドットだけ内側へ移動する */
  178.                 rc.d.left += 4;
  179.                 rc.d.top += 4;
  180.                 /* グローバル座標系に変換する */
  181.                 pev->where.x_y = GMLocalToGlobal(rc.l.l_t);
  182.                 /* イベントをマウス左ダウンイベントにする */
  183.                 pev->what = E_MSLDOWN;
  184.             }
  185.         }
  186.         break;
  187.     case E_UPDATE:            /* アップデートイベント        */
  188.         /* カーソルを点滅させるために、アップデート処理を行う */
  189.         WMUpdate(&dlgPtr->window); /* アップデートを開始する    */
  190.         WMUpdtOver(&dlgPtr->window); /* アップデートを終了する    */
  191.         break;
  192.     }
  193.     return 0;
  194. }
  195.  
  196. /******************************************************************************
  197.  *    setDItemText():    ダイアログアイテムの編集可能テキストへの文字列の設定
  198.  ******************************************************************************
  199.  *    引数:    Dialog *dlgPtr    ダイアログポインタ
  200.  *        int num        ダイアログのアイテム番号
  201.  *        _LASCII str    設定するLASCII型文字列
  202.  */
  203. void setDItemText(Dialog *dlgPtr, int num, _LASCII str)
  204. {
  205.     short type;
  206.     Rect rc;
  207.     Handle item;
  208.  
  209.     /* ダイアログアイテムのハンドルを取得する */
  210.     DIGet(dlgPtr, num, &type, &item, &rc);
  211.     DITSet(type, item, str);    /* 編集可能テキストに文字列を設定する */
  212. }
  213.  
  214. /******************************************************************************
  215.  *    getDItemText():    ダイアログアイテムの編集可能テキストの文字列の取得
  216.  ******************************************************************************
  217.  *    引数:    Dialog *dlgPtr    ダイアログポインタ
  218.  *        int num        ダイアログのアイテム番号
  219.  *        _LASCII str    LASCII型文字列を格納するポインタ
  220.  */
  221. void getDItemText(Dialog *dlgPtr, int num, _LASCII str)
  222. {
  223.     short type;
  224.     Rect rc;
  225.     Handle item;
  226.  
  227.     /* ダイアログアイテムのハンドルを取得する */
  228.     DIGet(dlgPtr, num, &type, &item, &rc);
  229.     DITGet(type, item, str);    /* 編集可能テキストの文字列を取得する */
  230.     str[str[0] + 1] = 0;        /* 文字列の最後に0を付加する    */
  231. }
  232.